1
2
3
Nästa
Ångra ett åtagande och gör om
$ git commit -m "Något fruktansvärt missvisat" # (0: Din olycka)
$ git reset HEAD ~ # (1)
<< redigera filer efter behov >> # (2)
$ git add. # (3)
$ git commit -c ORIG_HEAD # (4)
Detta kommando är ansvarigt för ångra. Det kommer att ångra ditt senaste åtagande medan du lämnar ditt arbetsträd (filernas tillstånd på disken) orörd. Du måste lägga till dem igen innan du kan begå dem igen).
Gör korrigeringar i arbetande trädfiler.
git lägg till allt du vill inkludera i ditt nya engagemang.
Genomför ändringarna och återanvänd det gamla meddelandet. reset kopierade det gamla huvudet till .git / ORIG_HEAD; engagera med -c ORIG_HEAD öppnar en redigerare som ursprungligen innehåller loggmeddelandet från det gamla engagemanget och låter dig redigera det. Om du inte behöver redigera meddelandet kan du använda alternativet -C.
Alternativt, för att redigera det föregående engagemanget (eller bara dess meddelande), kommer commit --amend att lägga till ändringar i det aktuella indexet till det tidigare engagemanget.
För att ta bort (inte återställa) ett åtagande som har skickats till servern är det nödvändigt att skriva om historik med git push origin master --force.
Vidare läsning
Hur kan jag flytta HEAD tillbaka till en tidigare plats? (Fristående huvud) & Ångra åtaganden
Ovanstående svar visar dig git reflog, som du kan använda för att bestämma SHA-1 för det åtagande du vill återställa. När du har fått det här värdet använder du kommandosekvensen enligt ovan.
HEAD ~ är samma som HEAD ~ 1. Artikeln Vad är HEAD in git? är till hjälp om du vill koppla från flera åtaganden.
|
Ångra ett åtagande är lite skrämmande om du inte vet hur det fungerar. Men det är faktiskt otroligt enkelt om du förstår. Jag visar dig de fyra olika sätten du kan ångra ett åtagande på.
alternativ 1: git reset --hard
Anta att du har det här, där C är ditt HEAD och (F) är tillståndet för dina filer.
(F)
A-B-C
↑
bemästra
Du vill nuke begå C och aldrig se det igen och förlora alla ändringar i lokalt modifierade filer. Du gör detta:
git reset - hård HEAD ~ 1
Resultatet är:
(F)
A-B
↑
bemästra
Nu är B huvudet. Eftersom du använde --hard, återställs dina filer till deras tillstånd vid commit B.
alternativ 2: git reset
Ah, men antag att begå C inte var en katastrof, men bara lite av. Du vill ångra åtagandet men behålla dina ändringar för lite redigering innan du gör ett bättre åtagande. Börjar igen härifrån, med C som HEAD:
(F)
A-B-C
↑
bemästra
Du kan göra detta och lämna --hard:
git reset HEAD ~ 1
I detta fall är resultatet:
(F)
A-B-C
↑
bemästra
I båda fallen är HEAD bara en pekare till det senaste åtagandet. När du gör en git reset HEAD ~ 1, säger du till Git att flytta HEAD-pekaren tillbaka en commit. Men (om du inte använder - hårt) lämnar du dina filer som de var. Så nu visar git-status de ändringar du kontrollerat i C. Du har inte tappat något!
alternativ 3: git reset --soft
För den lättaste kontakten kan du till och med ångra ditt åtagande men lämna dina filer och ditt index:
git reset --soft HEAD ~ 1
Detta lämnar inte bara dina filer ensamma, det lämnar även ditt index ensamt. När du gör git-status ser du att samma filer finns i indexet som tidigare. Faktum är att direkt efter detta kommando kan du göra git commit och du skulle göra om samma engagemang som du just hade.
alternativ 4: du har git reset - hårt och behöver få tillbaka den koden
En sak till: Anta att du förstör ett engagemang som i det första exemplet, men sedan upptäcker att du trots allt behövde det? Tuff tur, eller hur?
Nej, det finns fortfarande ett sätt att få tillbaka det. Skriv git reflog och du kommer att se en lista över (partiella) commit shas (det vill säga hash) som du har flyttat runt i. Hitta det commit du förstörde och gör detta:
git checkout -b someNewBranchName shaYouDestroyed
Du har nu återupplivat det åtagandet. Åtaganden förstörs faktiskt inte i Git i cirka 90 dagar, så du kan vanligtvis gå tillbaka och rädda en som du inte menade att bli av med.
|
Det finns två sätt att "ångra" ditt senaste åtagande, beroende på om du redan har gjort ditt åtagande offentligt eller inte (tryckt till ditt fjärrförvar):
Hur man ångrar ett lokalt åtagande
Låt oss säga att jag begick lokalt, men nu vill jag ta bort det åtagandet.
git-logg
begå 101: dåligt begå # Senaste begå. Detta skulle kallas "HEAD".
begå 100: bra engagera # Näst till sista begå. Det är den vi vill ha.
För att återställa allt till det sätt som det var före den senaste förpliktelsen måste vi återställa till förpliktelsen före HEAD:
git reset --soft HEAD ^ # Använd --soft om du vill behålla dina ändringar
git reset --hard HEAD ^ # Använd --hard om du inte bryr dig om att behålla de ändringar du gjorde
Nu visar git-loggen att vårt senaste engagemang har tagits bort.
Hur man ångrar ett offentligt åtagande
Om du redan har gjort dina åtaganden offentliga vill du skapa ett nytt åtagande som kommer att "återställa" ändringarna du gjorde i ditt tidigare åtagande (nuvarande HEAD).
git revert HEAD
Dina ändringar kommer nu att återställasoch redo för dig att begå:
git commit -m 'återställa filen som jag tog bort av misstag'
git-logg
begå 102: återställa filen som jag tog bort av misstag
begå 101: ta bort en fil som vi inte behöver
begå 100: lägga till en fil som vi behöver
För mer information, kolla in Git Basics - Undoing Things.
|
Lägg till / ta bort filer för att få saker som du vill:
git rm classdir
git tillsätt sourcedir
Ändra sedan åtagandet:
git commit --amend
Det tidigare felaktiga åtagandet kommer att redigeras för att återspegla det nya indextillståndet - med andra ord kommer det att vara som att du aldrig gjorde misstaget i första hand.
Observera att du bara bör göra detta om du inte har tryckt ännu. Om du har tryckt måste du bara göra en fix normalt.
|
git rm yourfiles / *. class
git commit -a -m "raderade alla klassfiler i mappen" yourfiles ""
eller
git reset - hård HEAD ~ 1
Varning: Kommandot ovan tar permanent bort ändringarna till .java-filerna (och andra filer) som du ville begå.
Den hårda återställningen till HEAD-1 kommer att ställa in din arbetskopia till tillståndet för åtagandet innan du gjorde ditt fel.
|
För att ändra det senaste åtagandet
Byt ut filerna i indexet:
git rm --cached * .class
git add * .java
Sedan, om det är en privat filial, ändrar du åtagandet:
git commit --amend
Eller, om det är en delad filial, gör ett nytt åtagande:
git commit -m 'Ersätt .class-filer med .java-filer'
(För att ändra ett tidigare engagemang, använd den fantastiska interaktiva rebasen.)
ProTip ™: Lägg till * .klass till en gitignore för att förhindra att detta händer igen.
Att återställa ett åtagande
Att ändra ett engagemang är den perfekta lösningen om du behöver ändra det senaste engagemanget, men en mer allmän lösning återställs.
Du kan återställa Git till alla åtaganden med:
git reset @ ~ N
Där N är antalet åtaganden före HEAD, och @ ~ återställs till föregående engagemang.
Så istället för att ändra åtagandet kan du använda:
git reset @ ~
git add * .java
git commit -m "Lägg till .java-filer"
Kolla in git help reset, särskilt avsnitten på --soft --mixed och --hard, för en bättre förståelse för vad detta gör.
Reflog
Om du trasslar kan du alltid använda reflogen för att hitta borttagna åtaganden:
$ git reset @ ~
$ git reflog
c4f708b HEAD @ {0}: reset: flyttar till @ ~
2c52489 HEAD @ {1}: commit: lagt till några .class-filer
$ git återställer 2c52489
... och du är tillbaka där du började
|
Använd git revert .
För att få engagemangs-ID, använd bara git log.
|
Om du planerar att ångra ett lokalt åtagande helt, oavsett vad du ändrar, gjorde du på förpliktelsen, och om du inte oroar dig för det, gör bara följande kommando.
git reset - hård HEAD ^ 1
(Detta kommando ignorerar hela ditt engagemang och dina ändringar kommer att förloras helt från ditt lokala arbetsträd). Om du vill ångra ditt åtagande, men du vill att dina ändringar i iscenesättningsområdet (innan begå precis som efter git add) gör du följande kommando.
git reset --soft HEAD ^ 1
Nu kommer dina engagerade filer till iscensättningsområdet. Antag att om du vill ställa upp filerna, eftersom du behöver redigera fel innehåll, gör sedan följande kommando
git reset HEAD
Nu åtagit filer att komma från det iscensatta området till det ostadierade området. Nu är filer redo att redigeras, så vad du än ändrar vill du redigera och lägga till det och göra ett nytt / nytt engagemang.
Mer (länk trasig) (Arkiverad version)
|
Om du har Git Extras installerat kan du köra git ångra för att ångra det senaste åtagandet. git ångra 3 ångrar de tre sista åtagandena.
|
Jag ville ångra de senaste fem åtagandena i vårt delade arkiv. Jag letade upp det revisions-ID som jag ville återgå till. Sedan skrev jag in följande.
prompt> git reset --hard 5a7404742c85
HEAD är nu på 5a74047 Tillagd en sida till i katalogen
prompt> git push origin master --force
Totalt 0 (delta 0), återanvändt 0 (delta 0)
fjärrkontroll: bb / acl: neoneye är tillåten. accepterad nyttolast.
Till git@bitbucket.org: thecompany / prometheus.git
+ 09a6480 ... 5a74047 master -> master (tvångsuppdatering)
snabb>
|
Jag föredrar att använda git rebase -i för det här jobbet, för en fin lista dyker upp där jag kan välja åtaganden att bli av med. Det kanske inte är så direkt som några andra svar här, men det känns bara rätt.
Välj hur många åtaganden du vill lista och anropa så här (för att rekrytera de tre sista)
git rebase -i HEAD ~ 3
Provlista
välj aa28ba7 Sanity check för RtmpSrv-port
välj c26c541 RtmpSrv version alternativ
välj 58d6909 Stöd för bättre webbavkodning
Då tar Git bort åtaganden för alla rader som du tar bort.
|
Hur fixar du det tidigare lokala åtagandet
Använd git-gui (eller liknande) för att utföra en git-commit --amend. Från GUI kan du lägga till eller ta bort enskilda filer från engagemanget. Du kan också ändra meddelandet.
Hur du ångrar det tidigare lokala åtagandet
Återställ bara din filial till föregående plats (till exempel med gitk eller git rebase). Använd sedan dina ändringar igen från en sparad kopia. Efter skräpsamling i ditt lokala förvar kommer det att vara som det oönskade begåendet aldrig hände. För att göra allt detta i ett enda kommando, använd git reset HEAD ~ 1.
Ordav varning: Slarvig användning av git reset är ett bra sätt att få din arbetskopia i ett förvirrande tillstånd. Jag rekommenderar att Git-nybörjare undviker detta om de kan.
Hur man ångrar ett offentligt åtagande
Utför en omvänd körsbärsplockning (git-revert) för att ångra ändringarna.
Om du ännu inte har dragit andra ändringar till din filial kan du helt enkelt göra ...
git revert - no-edit HEAD
Tryck sedan din uppdaterade filial till det delade arkivet.
Åtagandeshistoriken visar båda åtagandena separat.
Avancerat: Korrigering av den privata filialen i det offentliga arkivet
Detta kan vara farligt - se till att du har en lokal kopia av filialen att trycka om.
Observera också: Du vill inte göra detta om någon annan kanske arbetar på filialen.
git push --delete (branch_name) ## ta bort den offentliga versionen av filialen
Rengör din filial lokalt och tryck sedan på ...
git push-ursprung (filialnamn)
I det normala fallet behöver du förmodligen inte oroa dig för att din privata filial begå historia är orörda. Tryck bara på en uppföljningsförpliktelse (se "Hur ångrar du ett offentligt åtagande" ovan), och gör senare en squash-sammanslagning för att dölja historien.
|
Om du vill ångra det permanent och du har klonat något arkiv
Åtgärds-id kan ses av
git-logg
Då kan du göra -
git reset --hard
git push-ursprung -f
|
Om du har begått skräp men inte drivit,
git reset --soft HEAD ~ 1
HEAD ~ 1 är en förkortning för åtagandet före huvudet. Alternativt kan du hänvisa till SHA-1 för hashen om du vill återställa till. --soft-alternativet kommer att ta bort engagemanget men det kommer att lämna alla dina ändrade filer "Ändringar som ska göras", som git-status skulle uttrycka det.
Om du vill bli av med ändringar i spårade filer i arbetsträdet sedan du begick innan du använder "--hard" istället.
ELLER
Om du redan har tryckt och någon drog vilket vanligtvis är mitt fall kan du inte använda git reset. Du kan dock göra en git-återställning,
git revert HEAD
Detta kommer att skapa ett nytt åtagande som vänder upp allt som införs genom oavsiktligt åtagande.
|
På SourceTree (GUI för GitHub) kan du högerklicka på commit och göra en 'Reverse Commit'. Detta bör ångra dina ändringar.
På terminalen:
Du kan alternativt använda:
git återgå
Eller:
git reset --soft HEAD ^ # Använd --soft om du vill behålla dina ändringar.
git reset --hard HEAD ^ # Använd --hard om du inte bryr dig om att behålla dina ändringar.
|
Ett enda kommando:
git reset - mjuk 'HEAD ^'
Det fungerar bra att ångra det senaste lokala åtagandet!
|
Återställ bara genom att göra kommandot nedan med git:
git reset --soft HEAD ~ 1
Förklara: vad gitåterställning gör, det återställs i princip till alla åtaganden som du vill gå tillbaka till, så om du kombinerar det med --soft-tangent, kommer det att gå tillbaka, men behåll ändringarna i dina filer, så du kommer tillbaka till det stadium som filen just har lagts till, HEAD är filialens huvud och om du kombinerar med ~ 1 (i det här fallet använder du också HEAD ^) kommer det bara att återgå till ett engagemang som du vill ha. ..
Jag skapar stegen i bilden nedan för mer information åt dig, inklusive alla steg som kan hända i verkliga situationer och begå koden:
|
Hur ångrar jag det senaste Git-åtagandet?
För att återställa allt till det sätt som det var före den senaste förpliktelsen, måste vi återställa till förpliktelsen före HEAD.
Om du inte vill behålla dina ändringar:
git reset - hård HEAD ^
Om du vill behålla dina ändringar:
git reset --soft HEAD ^
Kontrollera nu din git-logg. Det kommer att visa att vårt senaste åtagande har tagits bort.
|
"Återställ arbetsträdet till det senaste åtagandet"
git reset - hård HEAD ^
"Rensa okända filer från det arbetande trädet"
git clean
se - Git Snabbreferens
OBS: Detta kommando kommer att ta bort ditt tidigare engagemang, så använd det med försiktighet! git reset - hårt är säkrare.
|
Använd reflog för att hitta rätt tillstånd
git reflog
REFLOGERA INNAN ÅTERSTÄLL
Välj rätt reflog (f3cb6e2 i mitt fall) och skriv
git reset --hard f3cb6e2
Därefter återställs repo HEAD till det HEADid
LOGG EFTER ÅTERSTÄLLNING
Slutligen ser reflogen ut som bilden nedan
REFLOG FINAL
|
Första omgången:
git reflog
Det visar dig alla möjliga åtgärder du har utfört på ditt arkiv, till exempel, begå, slå samman, dra, etc.
Gör sedan:
git reset --hard ActionIdFromRefLog
|
Ångra det senaste åtagandet:
git reset --soft HEAD ^ eller git reset --soft HEAD ~
Detta kommer att ångra det senaste åtagandet.
Här --soft betyder återställning till iscenesättning.
HEAD ~ eller HEAD ^ betyder att flytta för att begå före HEAD.
Ersätt senaste åtagande till nytt åtagande:
git commit --ändra -m "meddelande"
Det kommer att ersätta det senaste åtagandet med det nya åtagandet.
|
En annan väg:
Kolla in den gren du vill återställa och återställ sedan din lokala arbetskopia till det åtagande att du vill vara den senaste på fjärrservern (allt efter det går hejdå). För att göra detta högerklickade jag i SourceTree på och valde "Återställ FILKNAMN till detta åtagande".
Navigera sedan till ditt förråds lokala katalog och kör det här kommandot:
git -c diff.mnemonicprefix = falsk -c core.quotepath = falsk push -v -f --tags REPOSITORY_NAMEBRANCHNAME: BRANCHNAME
Detta raderar alla åtaganden efter den aktuella i din lokala förvaring men endast för den ena grenen.
|
Skriv git-logg och hitta den senaste hash-koden och ange sedan:
git reset
|
I mitt fall begick jag av misstag några filer som jag inte ville. Så jag gjorde följande och det fungerade:
git reset --soft HEAD ^
git rm --cached [filer du inte behöver]
git add [filer du behöver]
git commit -c ORIG_HEAD
Verifiera resultaten med gitk eller git log --stat
|
Enkelt, kör det här på din kommandorad:
git reset - soft HEAD ~
|
Det finns två huvudscenarier
Du har inte drivit åtagandet ännu
Om problemet var extra filer du beställde (och du inte vill ha dem i arkivet) kan du ta bort dem med git rm och sedan begå med --amend
git rm
Du kan också ta bort hela kataloger med -r, eller till och med kombinera med andra Bash-kommandon
git rm -r
git rm $ (hitta-namn '* .class')
När du har tagit bort filerna kan du begå med alternativet --amend
git commit --amend -C HEAD # alternativet -C är att använda samma commit-meddelande
Detta kommer att skriva om ditt senaste lokala åtagande och ta bort de extra filerna, så dessa filer kommer aldrig att skickas på push och kommer också att tas bort från ditt lokala .git-arkiv av GC.
Du har redan drivit åtagandet
Du kan tillämpa samma lösning i det andra scenariot och sedan göra git push med -f-alternativet, men det rekommenderas inte eftersom det skriver över fjärrhistoriken med en avvikande förändring (det kan förstöra ditt förvar).
Istället måste du göra engagemanget utan --amend (kom ihåg det här om -amend `: Det alternativet skriver om historiken vid det senaste commitet).
|
För ett lokalt åtagande
git reset --soft HEAD ~ 1
eller om du inte kommer ihåg exakt i vilket engagemang det är, kan du använda
git rm --cached
För en tryckt begå
Det rätta sättet att ta bort filer från förvarets historik är att använda git filter-gren. Det är,
git filter-branch --index-filter 'git rm --cached ' HEAD
Men jag rekommenderar att du använder det här kommandot med försiktighet. Läs mer på git-filter-branch (1) Manual Page.
|
För att återställa till den tidigare versionen, ta bort alla ändringar som inte har begåtts permanent:
git reset - hård HEAD ~ 1
|
VAD SÅ ANVÄNDER, återställ - mjuk eller återställ - hårt?
Jag lägger bara till två cent för @ Kyralessas svar:
Om du är osäker på vad du ska använda, gå till --soft (jag använde denna konvention för att komma ihåg den - soft för säker).
Varför ?
Om du väljer - hårt av misstag förlorar du dina ändringar som det inte var tidigare.
Om du väljer --soft av misstag kan du uppnå samma resultat av --hard genom att använda ytterligare kommandon
git återställ HEAD-fil.html
git checkout - file.html
Fullständigt exempel
echo "några ändringar ..."> file.html
git lägg till fil.html
git begå -m "fel begå"
# Jag måste återställa
git reset - hård HEAD ~ 1 (avbryt ändringar)
# ELLER
git reset --soft HEAD ~ 1 # Tillbaka till iscensättning
git återställ HEAD file.html # tillbaka till arbetskatalogen
git checkout - file.html # avbryt ändringar
Krediter går till @Kyralessa.
|
1
2
3
Nästa
Mycket aktiv fråga. Tjäna 10 rykte för att svara på den här frågan. Kravet på rykte hjälper till att skydda denna fråga från skräppost och icke-svar-aktivitet.
Inte svaret du letar efter? Bläddra bland andra frågor taggade git version-control git-commit ångra eller ställ din egen fråga.